package com.sky.web.example.controller;

import com.sky.common.annotation.Anonymous;
import com.sky.web.example.bean.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.Map;

@Controller
@Anonymous
@RequestMapping("/api")
public class FirstController {


    /**************RequestMapping********************/
    /*
     * @ResponseBody 注解表示该方法的返回值会直接作为HTTP响应体返回给客户端，
     * 而不是被解析为视图名或跳转路径。
     *
     * @RequestMapping 注解用于将HTTP请求映射到特定的处理方法上。
     * 在这里，它指定了当HTTP请求的路径为 "/mapingTest1" 时，应该调用此方法。
     * 此方法支持所有HTTP方法（GET, POST, PUT, DELETE等），因为没有指定method属性。
     */
    @ResponseBody
    @RequestMapping(value = "/mapingTest1")
    public String mapingTest1(){
        /* 返回字符串 "mapingTest1 ok" 作为HTTP响应体。 */
        return "mapingTest1 ok";
    }

    /*
     * @ResponseBody 注解表示返回值直接作为HTTP响应体。
     *
     * @RequestMapping 注解在这里不仅指定了路径 "/mapingTest2"，
     * 还通过 method = RequestMethod.POST 指定了此方法只处理POST请求。
     * 这意味着，只有当HTTP请求是POST且路径为 "/mapingTest2" 时，此方法才会被调用。
     */
    @ResponseBody
    @RequestMapping(value = "/mapingTest2", method = RequestMethod.POST)
    public String mapingTest2() {
        /* 返回字符串 "mapingTest2 ok" 作为HTTP响应体。 */
        return "mapingTest2 ok";
    }

    /*
     * @ResponseBody 的作用同上，表示返回值直接作为HTTP响应体。
     *
     * @RequestMapping 注解指定了路径 "/mapingTest3" 和 HTTP方法为GET。
     * 重要的是，它还通过 params = "name" 指定了一个请求参数条件：
     * 只有当请求中包含名为"name"的参数时，此方法才会被调用。
     * 这意味着，对于路径为 "/mapingTest3" 的GET请求，如果请求中没有"name"参数，否则会报错
     */
    @ResponseBody
    @RequestMapping(value = "/mapingTest3", method = RequestMethod.GET, params = "name")
    public String mapingTest3(String name) {
        /* 返回字符串 "mapingTest3 ok" 作为HTTP响应体。 */
        System.out.println(name);
        return "mapingTest3 ok";
    }

    /**************RequestMapping********************/


    /**************************ResponseBody***********************************/
    /**
     * 处理 "/showPage" 的 GET 请求
     * @return 视图名称 "somePage"，Spring MVC 会根据视图解析器找到对应的视图文件并展示给用户
     */
    @GetMapping("/showPage")
    public String showPage() {
        // 返回视图名称，Spring MVC 会根据视图解析器来找到对应的视图文件
        return "somePage";
    }

    /**
     * 处理 "/getString" 的 GET 请求，并直接返回字符串响应
     * @return 自定义字符串 "I am jhon!"
     * @ResponseBody 注解表示该方法的返回值应该直接作为 HTTP 响应体返回，
     * 而不是解析为视图名称。这通常用于返回 JSON、XML 或纯文本等非 HTML 响应。
     */
    @GetMapping("/getString")
    @ResponseBody
    public String getString() {
        // 创建并返回一个自定义的字符串
        return "I am jhon!";
    }

    /**
     * 处理 "/getUserInfo" 的 GET 请求，并返回一个包含用户信息的 Map
     * @return 包含用户信息的 Map，其中包括用户的名字和电子邮件
     * @ResponseBody 注解表示该方法的返回值应该直接作为 HTTP 响应体返回。
     * 在这里，Spring MVC 会自动将 Map 转换为 JSON 格式并返回给客户端。
     */
    @GetMapping("/getUserInfo")
    @ResponseBody
    public Map<String, String> getUserInfo() {
        Map<String, String> userInfo = new HashMap<>();
        userInfo.put("name", "John Doe");
        userInfo.put("email", "john.doe@example.com");
        // 由于有 @ResponseBody 注解，Spring MVC 会将这个 Map 转换为 JSON 响应
        return userInfo;
    }

    /**
     * 处理 "/getUserObject" 的 GET 请求，并返回一个自定义的 User 对象
     * @return 自定义的 User 对象，包含用户的名字和电子邮件
     * @ResponseBody 注解表示该方法的返回值应该直接作为 HTTP 响应体返回。
     * 在这里，Spring MVC 会自动将 User 对象转换为 JSON 格式并返回给客户端。
     * 这通常用于返回复杂的对象结构。
     */
    @GetMapping("/getUserObject")
    @ResponseBody
    public User getUserObject() {
        // 创建并返回一个自定义的 User 对象
        return new User("John Doe", 18);
    }
    /**************************ResponseBody***********************************/



}
